package com.laolang.pluto.common.util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.EnumUtil;
import com.github.pagehelper.PageInfo;
import com.laolang.pluto.common.core.domain.common.Page;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 通用全局工具类
 *
 * @author laolang
 * @date 2021-08-01 16:43
 */
public class CommonUtil {

    /**
     * 转换 {@link PageInfo} 为 {@link Page}
     *
     * @param pageInfo {@link PageInfo} 对象
     * @param <T>      分页信息对象
     * @return 分页结果
     */
    public static <T> Page<T> pageInfo2Page(PageInfo<T> pageInfo) {
        Page<T> pageResult = new Page<>();
        pageResult.setPageNum(pageInfo.getPageNum());
        pageResult.setPageSize(pageInfo.getPageSize());
        pageResult.setSize(pageInfo.getSize());
        pageResult.setTotal(pageInfo.getTotal());
        pageResult.setPages(pageInfo.getPages());
        pageResult.setList(pageInfo.getList());
        return pageResult;
    }

    /**
     * 转换 {@link PageInfo} 为 {@link Page}
     *
     * @param pageInfo {@link PageInfo} 对象
     * @param tranform T->R 转换函数
     * @param <T>      原始分页信息对象
     * @param <R>      分页信息对象VO
     * @return 分页结果
     */
    public static <T, R> Page<R> pageInfo2Page(PageInfo<T> pageInfo, Function<T, R> tranform) {
        Page<R> pageResult = new Page<>();
        pageResult.setPageNum(pageInfo.getPageNum());
        pageResult.setPageSize(pageInfo.getPageSize());
        pageResult.setSize(pageInfo.getSize());
        pageResult.setTotal(pageInfo.getTotal());
        pageResult.setPages(pageInfo.getPages());
        pageResult.setList(CollUtil.isNotEmpty(pageInfo.getList()) ?
                pageInfo.getList().stream().map(tranform).collect(Collectors.toList()) : new ArrayList<>());
        return pageResult;
    }

    /**
     * 判断常量枚举值列表中是否包含某值
     *
     * @param clazz 枚举类
     * @param value 值
     * @return boolean
     */
    public static boolean enumHasValue(Class<? extends Enum<?>> clazz, Integer value) {
        boolean has = false;
        List<Object> valueObjects = EnumUtil.getFieldValues(clazz, "value");
        for (Object valueObject : valueObjects) {
            if (Integer.parseInt(valueObject.toString()) == value) {
                has = true;
                break;
            }
        }
        return has;
    }
}
